/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.igorov.efficientsoft.business.gestorcliente;

import com.igorov.efficientsoft.business.similaridad.SimilaridadStrings;
import com.igorov.efficientsoft.business.similaridad.SimilaridadStringsCoseno;
import com.igorov.efficientsoft.dataaccess.domain.ClienteDAO;
import com.igorov.efficientsoft.dataaccess.model.TclienteVO;
import com.igorov.efficientsoft.dataaccess.model.TzonaVO;
import com.igorov.efficientsoft.services.ClienteDTO;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author igorov
 */
public class GestorClienteImpl implements GestorCliente{

    private ClienteDAO clienteDAO;
    private SimilaridadStrings similaridad;
    private List<TclienteVO> clienteVOs;
    private static Double umbral = 0.2;

    public ClienteDAO getClienteDAO() {
        return clienteDAO;
    }
    
    public void setClienteDAO(ClienteDAO clienteDAO) {
        this.clienteDAO = clienteDAO;
    }

    public SimilaridadStrings getSimilaridad() {
        return similaridad;
    }

    public void setSimilaridad(SimilaridadStrings similaridad) {
        this.similaridad = similaridad;
    }
    

    public List<ClienteDTO> buscarClientes(String cadena) {
//        SimilaridadStrings similaridad = new SimilaridadStringsCoseno();
        List<TclienteVO> tclienteVOs = clienteDAO.getAll();
        List<ClienteDTO> resultado = new LinkedList<ClienteDTO>();
        
        for (Iterator<TclienteVO> it = tclienteVOs.iterator(); it.hasNext();) {
            TclienteVO tclienteVO = it.next();
            String nombrePersona = tclienteVO.getCnomCli() + " " + tclienteVO.getCapePat() + " " + 
                                tclienteVO.getCapeMat();
            if ( similaridad.getSimilaridad(nombrePersona, cadena) > umbral){
                ClienteDTO clienteDTO = new ClienteDTO();
                clienteDTO.setCodigo(tclienteVO.getNcodCli());
                clienteDTO.setNombres(tclienteVO.getCnomCli());
                clienteDTO.setApellidoPaterno(tclienteVO.getCapePat());
                clienteDTO.setApellidoMaterno(tclienteVO.getCapeMat());
                resultado.add(clienteDTO);
            }
            
        }
        return resultado;
    }
    
    public void deleteById(int i) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void deleteByIndex(int index) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public List<ClienteDTO> getAll() {
        updateListVo();
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public ClienteDTO getById(int voId) {
        TclienteVO tclienteVO = clienteDAO.get(voId);
        ClienteDTO clienteDTO = new ClienteDTO();
        clienteDTO.setCodigo(tclienteVO.getNcodCli());
        clienteDTO.setApellidoMaterno(tclienteVO.getCapeMat());
        clienteDTO.setApellidoPaterno(tclienteVO.getCapePat());
        clienteDTO.setColorCasa(tclienteVO.getCcolCasa());
        clienteDTO.setDireccion(tclienteVO.getCdirCli());
        clienteDTO.setDni(tclienteVO.getCdni());
        clienteDTO.setNombres(tclienteVO.getCnomCli());
        clienteDTO.setNumeroPisos(tclienteVO.getNpisos());
        clienteDTO.setReferencias(tclienteVO.getCrefCli());
        clienteDTO.setTelefonoPrincipal(tclienteVO.getCtelPrin());
        clienteDTO.setTelefonoSecundario(tclienteVO.getCtelSec());
        
        
        return clienteDTO;
    }

    public ClienteDTO getByIndex(int indice) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public int getIdAtIndex(int indice) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public int getIndexOf(int voId) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void saveOrUpdate(ClienteDTO o) {
        TclienteVO tclienteVO = new TclienteVO();
        
        if (o.getCodigo() != 0) {
            tclienteVO.setNcodCli(o.getCodigo());
        }
        tclienteVO.setCapeMat(o.getApellidoMaterno());
        tclienteVO.setCapePat(o.getApellidoPaterno());
        tclienteVO.setCcolCasa(o.getColorCasa());
        tclienteVO.setCdirCli(o.getDireccion());
        tclienteVO.setCdni(o.getDni());
        tclienteVO.setCnomCli(o.getNombres());
        tclienteVO.setCrefCli(o.getReferencias());
        tclienteVO.setCtelPrin(o.getTelefonoPrincipal());
        tclienteVO.setCtelSec(o.getTelefonoSecundario());
        tclienteVO.setNpisos(o.getNumeroPisos());
        
        TzonaVO tzonaVO = new TzonaVO();
        tzonaVO.setNcodZon(o.getCodZona());
        tclienteVO.setTzona(tzonaVO);
        
        clienteDAO.saveOrUpdate(tclienteVO);
    }

    public void updateListVo() {
        clienteVOs = clienteDAO.getAll();
    }
    
    private ClienteDTO pasarVOtoDTO(TclienteVO tclienteVO){
        
        return null;
    }
}
